<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="BUziQ" id="BUziQ"><span data-lake-id="u797d1707" id="u797d1707">典型回答</span></h1>
  <p data-lake-id="u14437b08" id="u14437b08"><br></p>
  <p data-lake-id="u38617801" id="u38617801"><span data-lake-id="u0def9d27" id="u0def9d27">Tomcat的类加载机制是指Tomcat在运行时如何加载和管理Java类。Tomcat的类加载机制的实现并没有严格遵守双亲委派原则，而是采用了一种层次化的类加载器结构，这种结构旨在提供更好的隔离性和灵活性，以支持多个Web应用程序的部署和运行。</span></p>
  <p data-lake-id="u28389265" id="u28389265"><span data-lake-id="ua989143d" id="ua989143d">​</span><br></p>
  <p data-lake-id="u95656dca" id="u95656dca"><br></p>
  <p data-lake-id="u307cbc20" id="u307cbc20"><span data-lake-id="ub3eb9ba3" id="ub3eb9ba3">关于Tomcat的ClassLoader的关系，网上有各种各样的图，但是大部分都是不对的。甚至有一些画完图之后竟然还能自圆其说。。。</span></p>
  <p data-lake-id="uc4554614" id="uc4554614"><span data-lake-id="ue794203c" id="ue794203c">​</span><br></p>
  <p data-lake-id="uf00da50b" id="uf00da50b"><span data-lake-id="u49fdbb93" id="u49fdbb93">下面这张图，是我基于Tomcat官网，以及源码总结之后的一张图（从Tomcat 6到Tomcat 10，都长这个样）：</span></p>
  <p data-lake-id="ua4d61024" id="ua4d61024"><span data-lake-id="uf6eca522" id="uf6eca522">​</span><br></p>
  <p data-lake-id="u672f2464" id="u672f2464"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690621553375-f51add4c-18d7-44a6-a9f2-e7a0d06790dc.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_39%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u53ffbd10" id="u53ffbd10"><br></p>
  <p data-lake-id="u2f7ed9db" id="u2f7ed9db"><span data-lake-id="u8e69f961" id="u8e69f961">但是，默认情况下，</span><strong><span data-lake-id="u62416915" id="u62416915">Server类加载器和Shared类加载器是未定义的</span></strong><span data-lake-id="ub5b58f9f" id="ub5b58f9f">，需要通过在conf/catalina.properties中定义server.loader和/或shared.loader属性的值，才会是这个更复杂的层次结构。</span></p>
  <p data-lake-id="u93c880de" id="u93c880de"><span data-lake-id="u4cde9fc8" id="u4cde9fc8">​</span><br></p>
  <p data-lake-id="uadcce214" id="uadcce214"><span data-lake-id="u14d4900b" id="u14d4900b">Server类加载器只对Tomcat内部可见，对于Web应用程序完全不可见。</span></p>
  <p data-lake-id="ue216e85e" id="ue216e85e"><span data-lake-id="u6c2557e5" id="u6c2557e5">​</span><br></p>
  <p data-lake-id="u8529fe3a" id="u8529fe3a"><span data-lake-id="uf542576c" id="uf542576c">Shared类加载器对所有Web应用程序可见，可以用于在所有Web应用程序之间共享代码。但是，对这些共享代码进行更新将需要重新启动Tomcat。</span></p>
  <p data-lake-id="uab6633ff" id="uab6633ff"><span data-lake-id="ue3a6ffa8" id="ue3a6ffa8">​</span><br></p>
  <p data-lake-id="ud5f09b00" id="ud5f09b00"><span data-lake-id="ueb5edb16" id="ueb5edb16">所以，真正的需要一定有的，并且我们通常需要关注的就是下面这个层级关系：</span></p>
  <p data-lake-id="u2241d38d" id="u2241d38d"><span data-lake-id="uac036e5c" id="uac036e5c">​</span><br></p>
  <p data-lake-id="ued247711" id="ued247711"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690621564568-3476edd5-3b8d-40b8-bca9-bf6972184af0.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_37%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uc4fa809e" id="uc4fa809e"><br></p>
  <p data-lake-id="u43260b9a" id="u43260b9a"><strong><span data-lake-id="u6983453b" id="u6983453b">启动类加载器（Bootstrap ClassLoader）</span></strong><span data-lake-id="u81a97c2c" id="u81a97c2c">： 负责加载JVM自身的核心类库（如java.lang、java.util等）和JVM相关的类。启动类加载器是JVM的一部分，负责加载JVM运行所需的基础类。主要加载JRE中的lib包及lib/ext包下的内容</span></p>
  <p data-lake-id="u63d5a7d2" id="u63d5a7d2"><span data-lake-id="ue5cba26b" id="ue5cba26b">​</span><br></p>
  <p data-lake-id="u43dff1e3" id="u43dff1e3"><strong><span data-lake-id="u3a0f4645" id="u3a0f4645">系统类加载器（System Class Loader）</span></strong><span data-lake-id="ub83f6452" id="ub83f6452">，负载加载Tomcat内部的一些核心类库，这些类一般在$CATALINA_HOME/bin这个目录下， 一般包含bootstarap.jar、tomcat-juli.jar以及common-daemon.jar等。</span></p>
  <p data-lake-id="u5670be83" id="u5670be83"><span data-lake-id="udfe31d75" id="udfe31d75">​</span><br></p>
  <p data-lake-id="u02d4039d" id="u02d4039d"><strong><span data-lake-id="uade3acf2" id="uade3acf2">公共类加载器（Common Class Loader）</span></strong><span data-lake-id="uc96e6e45" id="uc96e6e45">： 负责加载Tomcat的公共类和库，位于$CATALINA_HOME/lib目录下的JAR文件。这些类库是Tomcat启动时加载的，是整个Tomcat实例中共享的类。</span></p>
  <p data-lake-id="u6d886d24" id="u6d886d24"><br></p>
  <p data-lake-id="u3f35da39" id="u3f35da39"><strong><span data-lake-id="u6470f7a5" id="u6470f7a5">Web应用程序类加载器（Webapp Class Loader</span></strong><span data-lake-id="ub8947215" id="ub8947215">）： 每个Web应用程序都有一个独立的Web应用程序类加载器，负责加载该Web应用程序的类和资源。它从$CATALINA_HOME/webapps/&lt;webapp_name&gt;/WEB-INF/classes目录和$CATALINA_HOME/webapps/&lt;webapp_name&gt;/WEB-INF/lib目录加载类和JAR文件。</span></p>
  <p data-lake-id="ue2dca8d3" id="ue2dca8d3"><span data-lake-id="ue0b405e9" id="ue0b405e9">​</span><br></p>
  <h1 data-lake-id="wUXmd" id="wUXmd"><span data-lake-id="ua5398274" id="ua5398274">扩展知识</span></h1>
  <p data-lake-id="ud069f99f" id="ud069f99f"><br></p>
  <h2 data-lake-id="AgkZZ" id="AgkZZ"><span data-lake-id="ub8bfafc5" id="ub8bfafc5">Tomcat类加载机制</span></h2>
  <p data-lake-id="u17ce9ddf" id="u17ce9ddf"><br></p>
  <p data-lake-id="u8ae15b6b" id="u8ae15b6b"><br></p>
  <p data-lake-id="u5e5b10a4" id="u5e5b10a4"><br></p>
 </body>
</html>